package ar.org.cfired.creditos;

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.HibernateException;
import org.jbpm.api.*;
import org.jboss.varia.scheduler.Schedulable;
import java.util.ArrayList; 

import ar.org.cfired.creditos.sbsa.JbpmSBA;
import ar.org.cfired.creditos.sbsa.Log;
import ar.org.cfired.creditos.sbsa.FechaActualizacion;
import ar.org.cfired.hibernate.utils.HibernateUtil;

public class Scheduler implements Schedulable{

	//@Override
	public void perform(Date arg0, long arg1) {
		System.out.println("Scheduler de Roger - Invocado en " + arg0);

		List<Solicitud> respuesta;
		Transaction tx = null;
		Session session = null;
		Session session2 = null;
		try {
			System.out.println("Scheduler de Roger - Por iniciar sesion");
			session = HibernateUtil.getSessionFactory().openSession();
		tx = session.beginTransaction();
		System.out.println("Scheduler de Roger - Transaccion iniciada");
        respuesta = (List<Solicitud>) session.createQuery("from Solicitud where cre_cargado_dprocess=0").list();

        System.out.println( "Scheduler de Roger -  " + respuesta.size() + " documento(s) nuevo(s)" );
        if (respuesta.size() > 0) {
        	session2 = HibernateUtil.getSessionFactory().openSession();
        }
        String textoFinal = "";
        Map<String,Object> variables;
        ProcessInstance processInstance;
        ExecutionService executionService = new Configuration().buildProcessEngine().getExecutionService();
        Solicitud loadedMsg = null;
        for ( Iterator<Solicitud> iter = respuesta.iterator(); iter.hasNext(); ) {
        	try {
        	session2.beginTransaction();
        	loadedMsg = (Solicitud) iter.next();
            textoFinal += loadedMsg.getCreApoderadoEmail() +  " \n";
          
            variables = loadedMsg.getVariables(session2);
    		processInstance = executionService.startProcessInstanceByKey("Creditos", variables);	            
            
    		loadedMsg.setCreCargadoDprocess(1);
    		session2.update(loadedMsg);
            session2.getTransaction().commit();
        	}
        	catch (HibernateException e) {
        		System.out.println( "Scheduler de Roger -  No se pudo cargar el documento - Hibernate Exception " + ((loadedMsg!=null)?loadedMsg.getCreId():""));
        		System.out.println(e.getMessage());  
        		e.printStackTrace();
        	}
        	catch (Exception e) {
        		System.out.println( "Scheduler de Roger -  No se pudo cargar el documento - Exception " + ((loadedMsg!=null)?loadedMsg.getCreId():""));
        		System.out.println(e.getMessage());
        		e.printStackTrace();
        	}
            //System.out.println( loadedMsg );
        }
        
        /*
        List<String> tratados = new ArrayList<String>();
        
        List<JbpmSBA> respuestaSBA;
        ProcessEngine processEngine = null;	
		FechaActualizacion fechaUltimaActualizacion = (FechaActualizacion)session.createQuery("from ar.org.cfired.creditos.sbsa.FechaActualizacion where ParDescripcion='Log'").uniqueResult();
		Double fecha = fechaUltimaActualizacion.getParFechamante();
		Double hora = fechaUltimaActualizacion.getParHoramante();
		System.out.println(fecha + " --- " + hora);
        List<Log> logs = (List<Log>) session.createQuery("from ar.org.cfired.creditos.sbsa.Log where FechaMante>" + fecha + " or ( FechaMante=" + fecha + " and HoraMante>" + hora + ")").list();
        
		if (logs.size()>0)
			if (session2 == null)
				session2 = HibernateUtil.getSessionFactory().openSession();
		
        for (Iterator<Log> it = logs.iterator(); it.hasNext(); ) {
			Log log = (Log)it.next();
			System.out.println("Scheduler de Roger - Leyendo el log del documento nro " + log.getNumeroSolicitud().intValue());
			String numero = String.valueOf(log.getNumeroSolicitud().intValue());
			if (numero.length()>3) {
				numero = numero.substring(numero.length()-3, numero.length()-1 );
			}
			else {
				for (int i =numero.length(); i<3; i++)numero = "0" + numero;
			}
			System.out.println("Scheduler de Roger - Leyendo el log del documento nro " + numero);
			respuestaSBA = (List<JbpmSBA>) session.createQuery("from ar.org.cfired.creditos.sbsa.JbpmSBA where substring(cre_numero, (length(cre_numero)-2), length(cre_numero)) = '" + numero + "'").list();	        
			session2.beginTransaction();
			for ( Iterator<JbpmSBA> iter = respuestaSBA.iterator(); iter.hasNext(); ) {
	        	JbpmSBA rta = (JbpmSBA)iter.next(); //SF2009018   
	        	
	        	System.out.println("Scheduler de Roger - Liberando documento ID: " + rta.getIdJBPM());
	        	if (!tratados.contains((String)rta.getIdJBPM())) {
	        		
	        	
	        	tratados.add((String)rta.getIdJBPM());
	        	if (processEngine == null) {
	        		processEngine = new Configuration().buildProcessEngine();	        		
	        	}
	        	System.out.println("Scheduler de Roger - NIVEL DE LOG --- '" + log.getNivel() + "'");
	        	processEngine.getExecutionService().signalExecutionById(rta.getIdJBPM(), ((log.getNivel().trim().equals("1"))?"OK":"Error"));
	        	
	        	System.out.println("Scheduler de Roger - Fecha=" + fecha + "; hora=" + hora);
	        	System.out.println("Scheduler de Roger - log.getFechaMante()=" + log.getFechaMante() + ";log.getHoraMante()=" + log.getHoraMante());
//	        	System.out.println("Scheduler de Roger - comp 1: " + Float.compare(log.getFechaMante(),fecha));
	//        	System.out.println("Scheduler de Roger - comp 2: " + Float.compare(log.getHoraMante(), hora));
	        	
	        	if (Double.compare(log.getFechaMante(),fecha)>0 ) {
	        		fecha = Double.valueOf(log.getFechaMante());
	        		hora = Double.valueOf(log.getHoraMante());
	        	}
	        	if (Double.compare(log.getFechaMante(), fecha)==0 && Double.compare(log.getHoraMante(), hora)>0) {
	        		hora = Double.valueOf(log.getHoraMante());
	        	}
	        	}
	        }
	        fechaUltimaActualizacion.setParFechamante(fecha);
	        fechaUltimaActualizacion.setParHoramante(hora);
	        session2.update(fechaUltimaActualizacion);
	        //session2.save(fechaUltimaActualizacion);
	        session2.getTransaction().commit();
		}
*/
        session.getTransaction().commit();
        System.out.println(textoFinal);
		} 
		catch (HibernateException e){
			System.out.println("Scheduler de Roger - Luego de Commit - HibernateException -" + e.getMessage());
			e.printStackTrace();
			if (tx!=null) 
				if (!tx.wasRolledBack())
					tx.rollback();
			
		}
		catch (Exception e) {
			System.out.println("Scheduler de Roger - Luego de Commit - Exception -" + e.getMessage());
			e.printStackTrace();
		}
		finally {
			if (session!=null)
				session.close();
		}
		
		System.out.println("Scheduler de Roger - Terminado en " + new Date());
		
	}

}
